#!/bin/bash

# 定义存储目录
REPO_DIR="/mnt/hgfs/G/ISO/repo"
REPO_FILE="/etc/yum.repos.d/local.repo"

# 定义要同步的初始仓库列表
INITIAL_REPO_LIST=(
    "base"
    "updates"
    "extras"
    "remi"
    "remi-php55"
    "remi-php56"
    "remi-debuginfo"
    "remi-php55-debuginfo"
    "remi-php56-debuginfo"
    "remi-modular"
    "remi-php54"
    "remi-php70"
    "remi-php70-debuginfo"
    "remi-php71"
    "remi-php71-debuginfo"
    "remi-php72"
    "remi-php72-debuginfo"
    "remi-php73"
    "remi-php73-debuginfo"
    "remi-php74"
    "remi-php74-debuginfo"
    "remi-php80"
    "remi-php80-debuginfo"
    "remi-php81"
    "remi-php81-debuginfo"
    "remi-php82"
    "remi-php82-debuginfo"
    "remi-php83"
    "remi-php83-debuginfo"
    "remi-safe"
    "remi-safe-debuginfo"
    "epel"
    "epel-debuginfo"
)

# 检查并安装必要工具
check_and_install_packages() {
    PACKAGES="yum-utils createrepo"
    for pkg in $PACKAGES; do
        if ! rpm -q $pkg > /dev/null 2>&1; then
            echo "$pkg 未安装，正在安装..."
            yum install -y $pkg
            if [ $? -ne 0 ]; then
                echo "安装 $pkg 失败，请检查网络和软件源。"
                exit 1
            fi
        else
            echo "$pkg 已经安装。"
        fi
    done
}

# 同步和创建元数据的函数
sync_repo() {
    local repo_name=$1
    local dest_dir=$2
    local sync_type="full"  # 默认是完整同步

    # 检查是否有同步标记文件，如果有则进行增量同步
    if [ -f "$dest_dir/$repo_name/.synced" ]; then
        sync_type="incremental"
    fi

    if [ "$sync_type" == "full" ]; then
        echo "正在进行 $repo_name 源的完整同步..."
        reposync -r $repo_name -p $dest_dir
        if [ $? -eq 0 ]; then
            echo "$repo_name 源完整同步成功。"
            # 创建同步标记文件
            touch "$dest_dir/$repo_name/.synced"
        else
            echo "$repo_name 源完整同步失败。"
            return 1
        fi
    else
        echo "正在进行 $repo_name 源的增量同步..."
        reposync -r $repo_name -p $dest_dir --newest-only
        if [ $? -eq 0 ]; then
            echo "$repo_name 源增量同步成功。"
        else
            echo "$repo_name 源增量同步失败。"
            return 1
        fi
    fi

    echo "正在为 $dest_dir/$repo_name 创建元数据..."
    createrepo $dest_dir/$repo_name
    if [ $? -eq 0 ]; then
        echo "$dest_dir/$repo_name 元数据创建成功。"
    else
        echo "$dest_dir/$repo_name 元数据创建失败。"
        return 1
    fi
}

# 调用检查并安装函数
check_and_install_packages

# 创建或清空local.repo文件
> $REPO_FILE

# 初始同步指定的仓库
for repo in "${INITIAL_REPO_LIST[@]}"; do
    sync_repo $repo $REPO_DIR
    if [ $? -ne 0 ]; then
        echo "同步 $repo 失败，跳过该仓库。"
        continue
    fi
done

# 检索目标目录下的所有子目录
REPOS=$(find $REPO_DIR -maxdepth 1 -mindepth 1 -type d -exec basename {} \;)

# 同步和创建元数据
for repo in $REPOS; do
    sync_repo $repo $REPO_DIR
    if [ $? -ne 0 ]; then
        echo "同步 $repo 失败，跳过该仓库。"
        continue
    fi

    # 写入仓库信息到local.repo文件
    cat <<EOL >> $REPO_FILE
[$repo]
name=$repo
baseurl=file://$REPO_DIR/$repo
enabled=1
gpgcheck=0

EOL
done

echo "所有操作完成。local.repo文件已更新。"
#说明
#这个脚本会在第一次运行时同步你指定的初始仓库列表，并在后续运行时进行增量同步。它还会检索 /mnt/hgfs/G/ISO/repo 目录下的所有子目录作为仓库写入 local.repo 文件。运行完成后，你的本地Yum源将包含所有同步的包和元数据。

